package cj.web.pay.alipay.interfaces;

import java.io.IOException;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cj.web.pay.alipay.util.AlipayNotify;
import cj.web.pay.alipay.util.FmtRequestParams;

/**
 * 支付宝 和 微信 异步回调抽象类
 * @author hejia
 *
 * 2016年12月14日
 */
public abstract class PayNotify{
	/**
	 * 判断该笔订单是否在商户网站中已经做过处理
		如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
		如果有做过处理，不执行商户的业务程序
	 * @param out_trade_no  商户订单号
	 * @param trade_no		支付宝订单号
	 */
	public abstract void tradeFinished(String out_trade_no, String trade_no);
	
	/**
	 * 判断该笔订单是否在商户网站中已经做过处理
		如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
		如果有做过处理，不执行商户的业务程序
		可以和tradeFinished方法相同
	 * @param out_trade_no  商户订单号
	 * @param trade_no      支付宝订单号
	 */
	public abstract void tradeSuccess(String out_trade_no, String trade_no);
	
	/**
	 * 判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致
	 * @param outTradeNo      根据商户订单号获得请求时的total_fee、seller_id
	 * @param notifyTotalFee  通知时获取的total_fee
	 * @param notifySellerId  通知时获取的seller_id
	 * @return
	 */
	public abstract boolean isNotifyInfoEqual(String outTradeNo, String notifyTotalFee, String notifySellerId);
	
	/**
	 * 支付宝付款成功服务器异步通知
	 * @param out_trade_no  //商户订单号
	 * @param trade_no      //支付宝交易号
	 * @param trade_status  //交易状态
	 * @param request
	 * @param response
	 * @return
	 * @throws IOException 
	 */
	public void notify(String out_trade_no, String trade_no, 
			String trade_status, HttpServletRequest request,HttpServletResponse response) throws IOException{
		//获取支付宝POST过来反馈信息
		Map<String,String> params = FmtRequestParams.getRequestParams(request);
		
		if(AlipayNotify.verify(params)){//验证成功
			//请在这里加上商户的业务逻辑程序代码
			String notifyTotalFee = params.get("total_fee").toString();
			String notifySellerId = params.get("seller_id").toString();

			if(trade_status.equals("TRADE_FINISHED")){
				//判断该笔订单是否在商户网站中已经做过处理
					//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
					//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
					//如果有做过处理，不执行商户的业务程序
				if(isNotifyInfoEqual(out_trade_no, notifyTotalFee, notifySellerId)){
					tradeFinished(out_trade_no, trade_no);
				}
				//注意：
				//退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知
			} else if (trade_status.equals("TRADE_SUCCESS")){
				//判断该笔订单是否在商户网站中已经做过处理
					//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
					//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
					//如果有做过处理，不执行商户的业务程序
				if(isNotifyInfoEqual(out_trade_no, notifyTotalFee, notifySellerId)){
					tradeSuccess(out_trade_no, trade_no);
				}
				//注意：
				//付款完成后，支付宝系统发送该交易状态通知
			}

			//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
			response.getWriter().write("success");	//请不要修改或删除

		}else{//验证失败
			response.getWriter().write("fail");	
		}
	}
}